#ifndef RAID_H_
#define RAID_H_


#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <errno.h>
#include "log/LogFile.h"
#include "lib1.h"

typedef struct {
	char* ip;
	int puertoPPD;
	int puertoSendPPD;
	int puertoPFS;
	int consolaFlag;
	int tamConexiones;
	int puertoPFSPoll;
	int levelLog;
	t_log *log;
}t_config;

typedef struct {
	t_config *configArch;
}t_raid;

typedef struct {
	uint32_t idDisco;
	t_queue *colaPendientesPetDisco;
	uint32_t estado;
	uint32_t sectoresCopiados;
	uint32_t soyDiscoD;
	t_queue *colaSectoresCopiados;
	t_socket_client *nroSocket;
	pthread_t tid;
	time_t tiempoInicio;
} t_infoDisco;

typedef struct {
	char* data;
	int nSector;
}t_payload;

typedef struct {
	uint32_t flagSincro;
	char tipoPeticion;
	int length;
	t_payload *sPayload;
	char ip[16];
} t_peticion;

typedef struct nodo{
	int32_t nroSocket; /*falta ver bien como se van a manejar los sockets con el FS*/
	t_peticion paquete;
	struct nodo *siguiente;
} t_nodo;

#define BUFFERSIZEPAYLOAD 512

/*INFO DISCO*/
#define Activo	0
#define Sincronizando	1
#define NoActivo	-1

#define Handshake 0
#define Escritura 1
#define Lectura 2
#define EscrituraSincro 16
#define LecturaSincro 32
#define FinSincro 64


/*Globales*/
extern t_list *tablaDisco;
extern t_list *listaPetResueltos;
extern t_list *arrayConexiones;
extern t_list *listaIndexThread;
extern t_config *config;
extern t_queue* peticiones;
extern uint32_t first;
extern int max;

t_config *getConfig();
void setConfig(t_config *config);

t_list *getListaIndexThread();
void setListaIndexThread(t_list *list);

t_list *getListaInfoDisco();
void setListaInfoDisco(t_list *list);

t_array *getArrayConexiones();
void setArrayConexiones(t_array *array);

t_list *getListaPeticionesPendientes();
void setListaPeticionesPendientes();

t_list *getListaPeticionesResueltas();
void setListaPeticionesResueltas(t_list *lista);

#endif /* RAID_H_ */
